import * as Cesium from '@cesiumjs';

// https://blog.csdn.net/qq_34870529/article/details/89712460

class CameraUtils {}

CameraUtils.getHeight = function(viewer) {
  if (viewer) {
    const {
      camera,
      scene
    } = viewer;
    var ellipsoid = scene.globe.ellipsoid;
    var height = ellipsoid.cartesianToCartographic(camera.position).height;
    return height;
  }
}

CameraUtils.getCenterPosition = function(viewer) {
  const {
    camera,
    canvas: {
      clientWidth,
      clientHeight
    }
  } = viewer.scene;
  var result = camera.pickEllipsoid(new Cesium.Cartesian2(clientWidth / 2, clientHeight / 2));
  var curPosition = Cesium.Ellipsoid.WGS84.cartesianToCartographic(result);
  curPosition.height = CameraUtils.getHeight(viewer);
  return curPosition
}

CameraUtils.getCurrentExtent = function(viewer) {
  // 范围对象
  var extent = {};

  // 得到当前三维场景
  var scene = viewer.scene;

  // 得到当前三维场景的椭球体
  var ellipsoid = scene.globe.ellipsoid;
  var canvas = scene.canvas;

  // canvas左上角
  var car3_lt = viewer.camera.pickEllipsoid(new Cesium.Cartesian2(0, 0), ellipsoid);

  // canvas右下角
  var car3_rb = viewer.camera.pickEllipsoid(new Cesium.Cartesian2(canvas.width, canvas.height), ellipsoid);

  // 当canvas左上角和右下角全部在椭球体上
  if (car3_lt && car3_rb) {
    var carto_lt = ellipsoid.cartesianToCartographic(car3_lt);
    var carto_rb = ellipsoid.cartesianToCartographic(car3_rb);
    extent.xmin = Cesium.Math.toDegrees(carto_lt.longitude);
    extent.ymax = Cesium.Math.toDegrees(carto_lt.latitude);
    extent.xmax = Cesium.Math.toDegrees(carto_rb.longitude);
    extent.ymin = Cesium.Math.toDegrees(carto_rb.latitude);
  }

  // 当canvas左上角不在但右下角在椭球体上
  else if (!car3_lt && car3_rb) {
    var car3_lt2 = null;
    var yIndex = 0;
    do {
      // 这里每次10像素递加，一是10像素相差不大，二是为了提高程序运行效率
      yIndex <= canvas.height ? yIndex += 10 : canvas.height;
      car3_lt2 = viewer.camera.pickEllipsoid(new Cesium.Cartesian2(0, yIndex), ellipsoid);
    } while (!car3_lt2);
    var carto_lt2 = ellipsoid.cartesianToCartographic(car3_lt2);
    var carto_rb2 = ellipsoid.cartesianToCartographic(car3_rb);
    extent.xmin = Cesium.Math.toDegrees(carto_lt2.longitude);
    extent.ymax = Cesium.Math.toDegrees(carto_lt2.latitude);
    extent.xmax = Cesium.Math.toDegrees(carto_rb2.longitude);
    extent.ymin = Cesium.Math.toDegrees(carto_rb2.latitude);
  }

  // 获取高度
  extent.height = Math.ceil(viewer.camera.positionCartographic.height);

  return extent;
}


export default CameraUtils;